package com.hzu.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import javax.persistence.Cache;

import org.hibernate.Query;

import com.hzu.dao.IBaseDao;
import com.hzu.utils.HibernateUtil;
import com.hzu.utils.Page;
import com.hzu.utils.QueryHelper;

/**
 * 所有dao的通用操作，希望所有的dao都继承此类
 * 
 * @author Jie.Yuan
 *
 * @param <T>
 */
public class BaseDao<T> implements IBaseDao<T> {

	// 当前操作的实际的bean类型
	private Class<T> clazz;
	// 获取类名称
	private String className;

	// 反射泛型
	public BaseDao() {
		Type type = this.getClass().getGenericSuperclass();
		// 转换为参数化类型
		ParameterizedType pt = (ParameterizedType) type; // BaseDao<Employee>
		// 得到实际类型
		Type types[] = pt.getActualTypeArguments();
		// 获取实际类型
		clazz = (Class<T>) types[0];
		className = clazz.getSimpleName();// 例如：Employee
	}

	@Override
	public void delete(int id) {
		HibernateUtil.startTransaction(false);
		HibernateUtil.getCurrentSession().createQuery("delete from " + className + " where id=?").setParameter(0, id).executeUpdate();
		HibernateUtil.commitTransaction(false);
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findById(int id) {
		return (T) HibernateUtil.getCurrentSession().get(clazz, id);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> getAll() {
		return HibernateUtil.getCurrentSession().createQuery("from " + className).list();
	}

	@Override
	public void save(T t) {
		HibernateUtil.startTransaction(false);
		HibernateUtil.getCurrentSession().save(t);
		HibernateUtil.commitTransaction(false);
	}

	@Override
	public void update(T t) {
		HibernateUtil.startTransaction(false);
		HibernateUtil.getCurrentSession().update(t);
		HibernateUtil.commitTransaction(false);
	}

	@Override
	public Page<T> getByPage(QueryHelper queryHelper, Page<T> page) {
		Query query = HibernateUtil.getCurrentSession().createQuery(queryHelper.getQueryListHql());
		List<Object> parameters = queryHelper.getParameters();
		if (parameters != null) {
			for (int i = 0; i < parameters.size(); i++) {
				query.setParameter(i, parameters.get(i));
			}
		}
		if (page.getPage() < 1)
			page.setPage(1);
		query.setFirstResult((page.getPage() - 1) * page.getRows());// 设置数据起始索引号
		query.setMaxResults(page.getRows());
		List items = query.list();
		// 获取总记录数
		Query queryCount = HibernateUtil.getCurrentSession().createQuery(queryHelper.getQueryCountHql());
		if (parameters != null) {
			for (int i = 0; i < parameters.size(); i++) {
				queryCount.setParameter(i, parameters.get(i));
			}
		}
		Long totalCount = (Long) queryCount.uniqueResult();
		page.setTotalRecord(totalCount.intValue());
		page.setList(items);
		return page;
	}

}
